home *** CD-ROM | disk | FTP | other *** search
/ Amiga Packmags / NewsFlash - Issue 18 (1991-05)(UGA - NewsFlash UK)(Disk 2 of 2)[bootable].zip / NewsFlash - Issue 18 (1991-05)(UGA - NewsFlash UK)(Disk 2 of 2)[bootable].adf / Source / PlayRoutine.asm.pp / PlayRoutine.asm
Assembly Source File  |  1978-01-24  |  11KB  |  553 lines

  1.                   ****************************************
  2.                   *** JamCrackerPro V1.0a play-routine ***
  3.                   ***   Originally coded by M. Gemmel  ***
  4.                   ***           Code optimised         ***
  5.                   ***         by Xag of Betrayal       ***
  6.                   ***    See docs for important info   ***
  7.                   ****************************************
  8.  
  9. DMAWAIT        EQU    $12C    ;Change to suit
  10.  
  11.     *** Relative offset definitions ***
  12.  
  13.         RSRESET        ;Instrument info structure
  14. it_name        RS.B    31
  15. it_flags        RS.B    1
  16. it_size        RS.L    1
  17. it_address    RS.L    1
  18. it_sizeof        RS.W    0
  19.  
  20.         RSRESET        ;Pattern info structure
  21. pt_size        RS.W    1
  22. pt_address    RS.L    1
  23. pt_sizeof        RS.W    0
  24.  
  25.         RSRESET        ;Note info structure
  26. nt_period        RS.B    1
  27. nt_instr        RS.B    1
  28. nt_speed        RS.B    1
  29. nt_arpeggio    RS.B    1
  30. nt_vibrato    RS.B    1
  31. nt_phase        RS.B    1
  32. nt_volume        RS.B    1
  33. nt_porta        RS.B    1
  34. nt_sizeof        RS.W    0
  35.  
  36.         RSRESET        ;Voice info structure
  37. pv_waveoffset    RS.W    1
  38. pv_dmacon        RS.W    1
  39. pv_custbase    RS.L    1
  40. pv_inslen        RS.W    1
  41. pv_insaddress    RS.L    1
  42. pv_peraddress    RS.L    1
  43. pv_pers        RS.W    3
  44. pv_por        RS.W    1
  45. pv_deltapor    RS.W    1
  46. pv_porlevel    RS.W    1
  47. pv_vib        RS.W    1
  48. pv_deltavib    RS.W    1
  49. pv_vol        RS.W    1
  50. pv_deltavol    RS.W    1
  51. pv_vollevel    RS.W    1
  52. pv_phase        RS.W    1
  53. pv_deltaphase    RS.W    1
  54. pv_vibcnt        RS.B    1
  55. pv_vibmax        RS.B    1
  56. pv_flags        RS.B    1
  57. pv_sizeof        RS.W    0
  58.  
  59.         SECTION    BTLCRACKER_PLAYER,CODE_C
  60.  
  61.     *** Test routine ***
  62.  
  63. Start:        move.l    4.w,a6
  64.         jsr    -132(a6)
  65.  
  66.         bsr.s    pp_init
  67.  
  68. .loop:        cmp.b    #$50,$DFF006
  69.         bne.s    .loop
  70.         move.w    #$0F00,$DFF180
  71.         bsr    pp_play
  72.         move.w    #$0000,$DFF180
  73.         btst    #6,$BFE001
  74.         bne.s    .loop
  75.  
  76.         bsr    pp_end
  77.  
  78.         move.l    4.w,a6
  79.         jsr    -138(a6)
  80.  
  81.         moveq    #0,d0
  82.         rts
  83.  
  84.     *** Initialise routine ***
  85.  
  86. pp_init:        lea    pp_song(PC),a0
  87.         addq.w    #4,a0
  88.         move.w    (a0)+,d0
  89.         move.w    d0,d1
  90.         move.l    a0,instable
  91.         mulu    #it_sizeof,d0
  92.         add.w    d0,a0
  93.  
  94.         move.w    (a0)+,d0
  95.         move.w    d0,d2
  96.         move.l    a0,patttable
  97.         mulu    #pt_sizeof,d0
  98.         add.w    d0,a0
  99.  
  100.         move.w    (a0)+,d0
  101.         move.w    d0,songlen
  102.         move.l    a0,songtable
  103.         add.w    d0,d0
  104.         add.w    d0,a0
  105.  
  106.         move.l    patttable(PC),a1
  107.         move.w    d2,d0
  108.         subq.w    #1,d0
  109. .l0:        move.l    a0,pt_address(a1)
  110.         move.w    (a1),d3        ;pt_size
  111.         mulu    #nt_sizeof*4,d3
  112.         add.w    d3,a0
  113.         addq.w    #pt_sizeof,a1
  114.         dbra    d0,.l0
  115.  
  116.         move.l    instable(PC),a1
  117.         move.w    d1,d0
  118.         subq.w    #1,d0
  119. .l1:        move.l    a0,it_address(a1)
  120.         move.l    it_size(a1),d2
  121.         add.l    d2,a0
  122.         add.w    #it_sizeof,a1
  123.         dbra    d0,.l1
  124.  
  125.         move.l    songtable(PC),pp_songptr
  126.         move.w    songlen(PC),pp_songcnt
  127.         move.l    pp_songptr(PC),a0
  128.         move.w    (a0),d0
  129.         mulu    #pt_sizeof,d0
  130.         add.l    patttable(PC),d0
  131.         move.l    d0,a0
  132.         move.l    a0,pp_pattentry
  133.         move.b    pt_size+1(a0),pp_notecnt
  134.         move.l    pt_address(a0),pp_address
  135.         move.b    #6,pp_wait
  136.         move.b    #1,pp_waitcnt
  137.         clr.w    pp_nullwave
  138.         move.w    #$000F,$DFF096
  139.  
  140.         lea    pp_variables(PC),a0
  141.         lea    $DFF0A0,a1
  142.         moveq    #1,d1
  143.         move.w    #$80,d2
  144.         moveq    #4-1,d0
  145. .l2:        move.w    #0,8(a1)
  146.         move.w    d2,(a0)        ;pv_waveoffset
  147.         move.w    d1,pv_dmacon(a0)
  148.         move.l    a1,pv_custbase(a0)
  149.         move.l    #pp_periods,pv_peraddress(a0)
  150.         move.w    #1019,pv_pers(a0)
  151.         clr.w    pv_pers+2(a0)
  152.         clr.w    pv_pers+4(a0)
  153.         clr.l    pv_por(a0)
  154.         clr.w    pv_porlevel(a0)
  155.         clr.l    pv_vib(a0)
  156.         clr.l    pv_vol(a0)
  157.         move.w    #$40,pv_vollevel(a0)
  158.         clr.l    pv_phase(a0)
  159.         clr.w    pv_vibcnt(a0)
  160.         clr.b    pv_flags(a0)
  161.         add.w    #pv_sizeof,a0
  162.         add.w    #$10,a1
  163.         add.w    d1,d1
  164.         add.w    #$40,d2
  165.         dbra    d0,.l2
  166.  
  167.         bset    #1,$BFE001
  168.  
  169.         rts
  170.  
  171.     *** Clean-up routine ***
  172.  
  173. pp_end:        moveq    #0,d0
  174.         lea    $DFF000,a0
  175.         move.w    d0,$A8(a0)
  176.         move.w    d0,$B8(a0)
  177.         move.w    d0,$C8(a0)
  178.         move.w    d0,$D8(a0)
  179.         move.w    #$000F,$96(a0)
  180.         bclr    #1,$BFE001
  181.         rts
  182.  
  183.     *** Play routine ***
  184.  
  185. pp_play:        lea    $DFF000,a6
  186.         subq.b    #1,pp_waitcnt
  187.         bne.s    .l0
  188.         bsr    pp_nwnt
  189.         move.b    pp_wait(PC),pp_waitcnt
  190.  
  191. .l0:        lea    pp_variables(PC),a1
  192.         bsr.s    pp_uvs
  193.         lea    pp_variables+pv_sizeof(PC),a1
  194.         bsr.s    pp_uvs
  195.         lea    pp_variables+2*pv_sizeof(PC),a1
  196.         bsr.s    pp_uvs
  197.         lea    pp_variables+3*pv_sizeof(PC),a1
  198.  
  199. pp_uvs:        move.l    pv_custbase(a1),a0
  200.  
  201. .l0:        move.w    pv_pers(a1),d0
  202.         bne.s    .l1
  203.         bsr    pp_rot
  204.         bra.s    .l0
  205. .l1:        add.w    pv_por(a1),d0
  206.         tst.w    pv_por(a1)
  207.         beq.s    .l1c
  208.         bpl.s    .l1a
  209.         cmp.w    pv_porlevel(a1),d0
  210.         bge.s    .l1c
  211.         bra.s    .l1b
  212. .l1a:        cmp.w    pv_porlevel(a1),d0
  213.         ble.s    .l1c
  214. .l1b:        move.w    pv_porlevel(a1),d0
  215.  
  216. .l1c:        add.w    pv_vib(a1),d0
  217.         cmp.w    #135,d0
  218.         bge.s    .l1d
  219.         move.w    #135,d0
  220.         bra.s    .l1e
  221. .l1d:        cmp.w    #1019,d0
  222.         ble.s    .l1e
  223.         move.w    #1019,d0
  224. .l1e:        move.w    d0,6(a0)
  225.         bsr    pp_rot
  226.  
  227.         move.w    pv_deltapor(a1),d0
  228.         add.w    d0,pv_por(a1)
  229.         cmp.w    #-1019,pv_por(a1)
  230.         bge.s    .l3
  231.         move.w    #-1019,pv_por(a1)
  232.         bra.s    .l5
  233. .l3:        cmp.w    #1019,pv_por(a1)
  234.         ble.s    .l5
  235.         move.w    #1019,pv_por(a1)
  236.  
  237. .l5:        tst.b    pv_vibcnt(a1)
  238.         beq.s    .l7
  239.         move.w    pv_deltavib(a1),d0
  240.         add.w    d0,pv_vib(a1)
  241.         subq.b    #1,pv_vibcnt(a1)
  242.         bne.s    .l7
  243.         neg.w    pv_deltavib(a1)
  244.         move.b    pv_vibmax(a1),pv_vibcnt(a1)
  245.  
  246. .l7:        move.w    pv_dmacon(a1),d0
  247.         move.w    pv_vol(a1),8(a0)
  248.         move.w    pv_deltavol(a1),d0
  249.         add.w    d0,pv_vol(a1)
  250.         tst.w    pv_vol(a1)
  251.         bpl.s    .l8
  252.         clr.w    pv_vol(a1)
  253.         bra.s    .la
  254. .l8:        cmp.w    #$40,pv_vol(a1)
  255.         ble.s    .la
  256.         move.w    #$40,pv_vol(a1)
  257.  
  258. .la:        btst    #1,pv_flags(a1)
  259.         beq.s    .l10
  260.         tst.w    pv_deltaphase(a1)
  261.         beq.s    .l10
  262.         bpl.s    .sk
  263.         clr.w    pv_deltaphase(a1)
  264. .sk:        move.l    pv_insaddress(a1),a0
  265.         move.w    (a1),d0        ;pv_waveoffset
  266.         neg.w    d0
  267.         lea    (a0,d0.w),a2
  268.         move.l    a2,a3
  269.         move.w    pv_phase(a1),d0
  270.         lsr.w    #2,d0
  271.         add.w    d0,a3
  272.  
  273.         moveq    #$40-1,d0
  274. .lb:        move.b    (a2)+,d1
  275.         ext.w    d1
  276.         move.b    (a3)+,d2
  277.         ext.w    d2
  278.         add.w    d1,d2
  279.         asr.w    #1,d2
  280.         move.b    d2,(a0)+
  281.         dbra    d0,.lb
  282.  
  283.         move.w    pv_deltaphase(a1),d0
  284.         add.w    d0,pv_phase(a1)
  285.         cmp.w    #$100,pv_phase(a1)
  286.         blt.s    .l10
  287.         sub.w    #$100,pv_phase(a1)
  288.  
  289. .l10:        rts
  290.  
  291. pp_rot:        move.w    pv_pers(a1),d0
  292.         move.w    pv_pers+2(a1),pv_pers(a1)
  293.         move.w    pv_pers+4(a1),pv_pers+2(a1)
  294.         move.w    d0,pv_pers+4(a1)
  295.         rts
  296.  
  297. pp_nwnt:        move.l    pp_address(PC),a0
  298.         add.l    #4*nt_sizeof,pp_address
  299.         subq.b    #1,pp_notecnt
  300.         bne.s    .l5
  301.  
  302. .l0:        addq.l    #2,pp_songptr
  303.         subq.w    #1,pp_songcnt
  304.         bne.s    .l1
  305.         move.l    songtable(PC),pp_songptr
  306.         move.w    songlen(PC),pp_songcnt
  307. .l1:        move.l    pp_songptr(PC),a1
  308.         move.w    (a1),d0
  309.         mulu    #pt_sizeof,d0
  310.         add.l    patttable(PC),d0
  311.         move.l    d0,a1
  312.         move.b    pt_size+1(a1),pp_notecnt
  313.         move.l    pt_address(a1),pp_address
  314.  
  315. .l5:        clr.w    pp_tmpdmacon
  316.         lea    pp_variables(PC),a1
  317.         bsr    pp_nnt
  318.         addq.w    #nt_sizeof,a0
  319.         lea    pp_variables+pv_sizeof(PC),a1
  320.         bsr    pp_nnt
  321.         addq.w    #nt_sizeof,a0
  322.         lea    pp_variables+2*pv_sizeof(PC),a1
  323.         bsr    pp_nnt
  324.         addq.w    #nt_sizeof,a0
  325.         lea    pp_variables+3*pv_sizeof(PC),a1
  326.         bsr    pp_nnt
  327.  
  328.         move.w    pp_tmpdmacon(PC),$96(a6)
  329.  
  330.         move.w    #DMAWAIT-1,d0
  331. .loop1:        dbra    .loop1
  332.  
  333.         lea    pp_variables(PC),a1
  334.         bsr.s    pp_scr
  335.         lea    pp_variables+pv_sizeof(PC),a1
  336.         bsr.s    pp_scr
  337.         lea    pp_variables+2*pv_sizeof(PC),a1
  338.         bsr.s    pp_scr
  339.         lea    pp_variables+3*pv_sizeof(PC),a1
  340.         bsr.s    pp_scr
  341.  
  342.         bset    #7,pp_tmpdmacon
  343.         move.w    pp_tmpdmacon(PC),$96(a6)
  344.  
  345.         move.w    #DMAWAIT-1,d0
  346. .loop2:        dbra    .loop2
  347.  
  348.         move.l    pp_variables+pv_insaddress(PC),$A0(a6)
  349.         move.w    pp_variables+pv_inslen(PC),$A4(a6)
  350.         move.l    pp_variables+pv_sizeof+pv_insaddress(PC),$B0(a6)
  351.         move.w    pp_variables+pv_sizeof+pv_inslen(PC),$B4(a6)
  352.         move.l    pp_variables+2*pv_sizeof+pv_insaddress(PC),$C0(a6)
  353.         move.w    pp_variables+2*pv_sizeof+pv_inslen(PC),$C4(a6)
  354.         move.l    pp_variables+3*pv_sizeof+pv_insaddress(PC),$D0(a6)
  355.         move.w    pp_variables+3*pv_sizeof+pv_inslen(PC),$D4(a6)
  356.  
  357.         rts
  358.  
  359. pp_scr:        move.w    pp_tmpdmacon(PC),d0
  360.         and.w    pv_dmacon(a1),d0
  361.         beq.s    .l5
  362.  
  363.         move.l    pv_custbase(a1),a0
  364.         move.l    pv_insaddress(a1),(a0)
  365.         move.w    pv_inslen(a1),4(a0)
  366.         move.w    pv_pers(a1),6(a0)
  367.         btst    #0,pv_flags(a1)
  368.         bne.s    .l5
  369.         move.l    #pp_nullwave,pv_insaddress(a1)
  370.         move.w    #1,pv_inslen(a1)
  371.  
  372. .l5:        rts
  373.  
  374. pp_nnt:        move.b    (a0),d1        ;nt_period
  375.         beq    .l5
  376.  
  377.         and.l    #$000000FF,d1
  378.         add.w    d1,d1
  379.         add.l    #pp_periods-2,d1
  380.         move.l    d1,a2
  381.  
  382.         btst    #6,nt_speed(a0)
  383.         beq.s    .l2
  384.         move.w    (a2),pv_porlevel(a1)
  385.         bra.s    .l5
  386.  
  387. .l2:        move.w    pv_dmacon(a1),d0
  388.         or.w    d0,pp_tmpdmacon
  389.  
  390.         move.l    a2,pv_peraddress(a1)
  391.         move.w    (a2),pv_pers(a1)
  392.         move.w    (a2),pv_pers+2(a1)
  393.         move.w    (a2),pv_pers+4(a1)
  394.  
  395.         clr.w    pv_por(a1)
  396.  
  397.         move.b    nt_instr(a0),d0
  398.         ext.w    d0
  399.         mulu    #it_sizeof,d0
  400.         add.l    instable(PC),d0
  401.         move.l    d0,a2
  402.         tst.l    it_address(a2)
  403.         bne.s    .l1
  404.         move.l    #pp_nullwave,pv_insaddress(a1)
  405.         move.w    #1,pv_inslen(a1)
  406.         clr.b    pv_flags(a1)
  407.         bra.s    .l5
  408.  
  409. .l1:        move.l    it_address(a2),a3
  410.         btst    #1,it_flags(a2)
  411.         bne.s    .l0a
  412.         move.l    it_size(a2),d0
  413.         lsr.l    #1,d0
  414.         move.w    d0,pv_inslen(a1)
  415.         bra.s    .l0
  416. .l0a:        move.w    (a1),d0        ;pv_waveoffset
  417.         add.w    d0,a3
  418.         move.w    #$20,pv_inslen(a1)
  419. .l0:        move.l    a3,pv_insaddress(a1)
  420.         move.b    it_flags(a2),pv_flags(a1)
  421.         move.w    pv_vollevel(a1),pv_vol(a1)
  422.  
  423. .l5:        move.b    nt_speed(a0),d0
  424.         and.b    #$0F,d0
  425.         beq.s    .l6
  426.         move.b    d0,pp_wait
  427.  
  428. .l6:        move.l    pv_peraddress(a1),a2
  429.         move.b    nt_arpeggio(a0),d0
  430.         beq.s    .l9
  431.         cmp.b    #$FF,d0
  432.         bne.s    .l7
  433.         move.w    (a2),pv_pers(a1)
  434.         move.w    (a2),pv_pers+2(a1)
  435.         move.w    (a2),pv_pers+4(a1)
  436.         bra.s    .l9
  437.  
  438. .l7:        and.b    #$0F,d0
  439.         add.b    d0,d0
  440.         ext.w    d0
  441.         move.w    (a2,d0.w),pv_pers+4(a1)
  442.         move.b    nt_arpeggio(a0),d0
  443.         lsr.b    #4,d0
  444.         add.b    d0,d0
  445.         ext.w    d0
  446.         move.w    (a2,d0.w),pv_pers+2(a1)
  447.         move.w    (a2),pv_pers(a1)
  448.  
  449. .l9:        move.b    nt_vibrato(a0),d0
  450.         beq.s    .ld
  451.         cmp.b    #$FF,d0
  452.         bne.s    .la
  453.         clr.l    pv_vib(a1)
  454.         clr.b    pv_vibcnt(a1)
  455.         bra.s    .ld
  456. .la:        clr.w    pv_vib(a1)
  457.         and.b    #$0F,d0
  458.         ext.w    d0
  459.         move.w    d0,pv_deltavib(a1)
  460.         move.b    nt_vibrato(a0),d0
  461.         lsr.b    #4,d0
  462.         move.b    d0,pv_vibmax(a1)
  463.         lsr.b    #1,d0
  464.         move.b    d0,pv_vibcnt(a1)
  465.  
  466. .ld:        move.b    nt_phase(a0),d0
  467.         beq.s    .l10
  468.         cmp.b    #$FF,d0
  469.         bne.s    .le
  470.         clr.w    pv_phase(a1)
  471.         move.w    #$FFFF,pv_deltaphase(a1)
  472.         bra.s    .l10
  473. .le:        and.b    #$0F,d0
  474.         ext.w    d0
  475.         move.w    d0,pv_deltaphase(a1)
  476.         clr.w    pv_phase(a1)
  477.  
  478. .l10:        move.b    nt_volume(a0),d0
  479.         bne.s    .l10a
  480.         btst    #7,nt_speed(a0)
  481.         beq.s    .l16
  482.         bra.s    .l11a
  483. .l10a:        cmp.b    #$FF,d0
  484.         bne.s    .l11
  485.         clr.w    pv_deltavol(a1)
  486.         bra.s    .l16
  487. .l11:        btst    #7,nt_speed(a0)
  488.         beq.s    .l12
  489. .l11a:        move.b    d0,pv_vol+1(a1)
  490.         move.b    d0,pv_vollevel+1(a1)
  491.         clr.w    pv_deltavol(a1)
  492.         bra.s    .l16
  493. .l12:        bclr    #7,d0
  494.         beq.s    .l13
  495.         neg.b    d0
  496. .l13:        ext.w    d0
  497.         move.w    d0,pv_deltavol(a1)
  498.  
  499. .l16:        move.b    nt_porta(a0),d0
  500.         beq.s    .l1a
  501.         cmp.b    #$FF,d0
  502.         bne.s    .l17
  503.         clr.l    pv_por(a1)
  504.         bra.s    .l1a
  505. .l17:        clr.w    pv_por(a1)
  506.         btst    #6,nt_speed(a0)
  507.         beq.s    .l17a
  508.         move.w    pv_porlevel(a1),d1
  509.         cmp.w    pv_pers(a1),d1
  510.         bgt.s    .l17c
  511.         neg.b    d0
  512.         bra.s    .l17c
  513.  
  514. .l17a:        bclr    #7,d0
  515.         bne.s    .l18
  516.         neg.b    d0
  517.         move.w    #135,pv_porlevel(a1)
  518.         bra.s    .l17c
  519.  
  520. .l18:        move.w    #1019,pv_porlevel(a1)
  521. .l17c:        ext.w    d0
  522. .l18a:        move.w    d0,pv_deltapor(a1)
  523.  
  524. .l1a:        rts
  525.  
  526.     *** Data section ***
  527.  
  528. pp_periods:    DC.W    1019,962,908,857,809,763,720,680,642,606,572,540
  529.         DC.W    509,481,454,428,404,381,360,340,321,303,286,270
  530.         DC.W    254,240,227,214,202,190,180,170,160,151,143,135
  531.         DC.W    135,135,135,135,135,135,135,135,135
  532.         DC.W    135,135,135,135,135,135
  533.  
  534. songlen:        DS.W    1
  535. songtable:    DS.L    1
  536. instable:        DS.L    1
  537. patttable:    DS.L    1
  538.  
  539. pp_wait:        DS.B    1
  540. pp_waitcnt:    DS.B    1
  541. pp_notecnt:    DS.B    1
  542. pp_address:    DS.L    1
  543. pp_songptr:    DS.L    1
  544. pp_songcnt:    DS.W    1
  545. pp_pattentry:    DS.L    1
  546. pp_tmpdmacon:    DS.W    1
  547. pp_variables:    DS.B    4*48
  548.  
  549. pp_nullwave:    DS.W    1
  550.  
  551. pp_song:        INCBIN    ""
  552.  
  553.